/*! Editor.md v1.5.0 | editormd.min.js | Open source online markdown editor. | MIT License | By: Pandao | https://github.com/pandao/editor.md | 2015-06-09 */ ! function(e) {
    "use strict";
    "function" == typeof require && "object" == typeof exports && "object" == typeof module ? module.exports = e : "function" == typeof define ? define.amd || define(["jquery"], e) : window.editormd = e()
}(function() {
    "use strict";
    var e = "undefined" != typeof jQuery ? jQuery : Zepto;
    if ("undefined" != typeof e) {
        var t = function(e, i) {
            return new t.fn.init(e, i)
        };
        t.title = t.$name = "Editor.md", t.version = "1.5.0", t.homePage = "https://pandao.github.io/editor.md/", t.classPrefix = "editormd-", t.toolbarModes = {
            full: ["undo", "redo", "|", "bold", "del", "italic", "quote", "ucwords", "uppercase", "lowercase", "|", "h1", "h2", "h3", "h4", "h5", "h6", "|", "list-ul", "list-ol", "hr", "|", "link", "reference-link", "image", "code", "preformatted-text", "code-block", "table", "datetime", "emoji", "html-entities", "pagebreak", "|", "goto-line", "clear", "search", "|", "help", "info", "watch", "preview", "fullscreen"],
            simple: ["undo", "redo", "|", "bold", "del", "italic", "quote", "uppercase", "lowercase", "|", "h1", "h2", "h3", "h4", "h5", "h6", "|", "list-ul", "list-ol", "hr", "|", "watch", "preview", "fullscreen", "|", "help", "info"],
            mini: ["undo", "redo", "|", "watch", "preview", "|", "help", "info"]
        }, t.defaults = {
            mode: "gfm",
            name: "",
            value: "",
            theme: "",
            editorTheme: "default",
            previewTheme: "",
            markdown: "",
            appendMarkdown: "",
            width: "100%",
            height: "100%",
            path: "./md-editor/js/lib/",
            pluginPath: "",
            delay: 300,
            autoLoadModules: !0,
            watch: !0,
            placeholder: "输入文字...",
            gotoLine: !0,
            codeFold: !1,
            autoHeight: !1,
            autoFocus: !0,
            autoCloseTags: !0,
            searchReplace: !0,
            syncScrolling: !0,
            readOnly: !1,
            tabSize: 4,
            indentUnit: 4,
            lineNumbers: !0,
            lineWrapping: !0,
            autoCloseBrackets: !0,
            showTrailingSpace: !0,
            matchBrackets: !0,
            indentWithTabs: !0,
            styleSelectedText: !0,
            matchWordHighlight: !0,
            styleActiveLine: !0,
            dialogLockScreen: !0,
            dialogShowMask: !0,
            dialogDraggable: !0,
            dialogMaskBgColor: "#fff",
            dialogMaskOpacity: .1,
            fontSize: "13px",
            saveHTMLToTextarea: !1,
            disabledKeyMaps: [],
            onload: function() {},
            onresize: function() {},
            onchange: function() {},
            onwatch: null,
            onunwatch: null,
            onpreviewing: function() {},
            onpreviewed: function() {},
            onfullscreen: function() {},
            onfullscreenExit: function() {},
            onscroll: function() {},
            onpreviewscroll: function() {},
            imageUpload: !1,
            imageFormats: ["jpg", "jpeg", "gif", "png", "bmp", "webp"],
            imageUploadURL: "",
            crossDomainUpload: !1,
            uploadCallbackURL: "",
            toc: !0,
            tocm: !1,
            tocTitle: "",
            tocDropdown: !1,
            tocContainer: "",
            tocStartLevel: 1,
            htmlDecode: !1,
            pageBreak: !0,
            atLink: !0,
            emailLink: !0,
            taskList: !1,
            emoji: !1,
            tex: !1,
            flowChart: !1,
            sequenceDiagram: !1,
            previewCodeHighlight: !0,
            toolbar: !0,
            toolbarAutoFixed: !0,
            toolbarIcons: "full",
            toolbarTitles: {},
            toolbarHandlers: {
                ucwords: function() {
                    return t.toolbarHandlers.ucwords
                },
                lowercase: function() {
                    return t.toolbarHandlers.lowercase
                }
            },
            toolbarCustomIcons: {
                lowercase: '<a href="javascript:;" title="Lowercase" unselectable="on"><i class="fa" name="lowercase" style="font-size:24px;margin-top: -10px;">a</i></a>',
                ucwords: '<a href="javascript:;" title="ucwords" unselectable="on"><i class="fa" name="ucwords" style="font-size:20px;margin-top: -3px;">Aa</i></a>'
            },
            toolbarIconsClass: {
                undo: "fa-undo",
                redo: "fa-repeat",
                bold: "fa-bold",
                del: "fa-strikethrough",
                italic: "fa-italic",
                quote: "fa-quote-left",
                uppercase: "fa-font",
                h1: t.classPrefix + "bold",
                h2: t.classPrefix + "bold",
                h3: t.classPrefix + "bold",
                h4: t.classPrefix + "bold",
                h5: t.classPrefix + "bold",
                h6: t.classPrefix + "bold",
                "list-ul": "fa-list-ul",
                "list-ol": "fa-list-ol",
                hr: "fa-minus",
                link: "fa-link",
                "reference-link": "fa-anchor",
                image: "fa-picture-o",
                code: "fa-code",
                "preformatted-text": "fa-file-code-o",
                "code-block": "fa-file-code-o",
                table: "fa-table",
                datetime: "fa-clock-o",
                emoji: "fa-smile-o",
                "html-entities": "fa-copyright",
                pagebreak: "fa-newspaper-o",
                "goto-line": "fa-terminal",
                watch: "fa-eye-slash",
                unwatch: "fa-eye",
                preview: "fa-desktop",
                search: "fa-search",
                fullscreen: "fa-arrows-alt",
                clear: "fa-eraser",
                help: "fa-question-circle",
                info: "fa-info-circle"
            },
            toolbarIconTexts: {},
            lang: {
                name: "zh-cn",
                description: "开源在线Markdown编辑器<br/>Open source online Markdown editor.",
                tocTitle: "目录",
                toolbar: {
                    undo: "撤销（Ctrl+Z）",
                    redo: "重做（Ctrl+Y）",
                    bold: "粗体",
                    del: "删除线",
                    italic: "斜体",
                    quote: "引用",
                    ucwords: "将每个单词首字母转成大写",
                    uppercase: "将所选转换成大写",
                    lowercase: "将所选转换成小写",
                    h1: "标题1",
                    h2: "标题2",
                    h3: "标题3",
                    h4: "标题4",
                    h5: "标题5",
                    h6: "标题6",
                    "list-ul": "无序列表",
                    "list-ol": "有序列表",
                    hr: "横线",
                    link: "链接",
                    "reference-link": "引用链接",
                    image: "添加图片",
                    code: "行内代码",
                    "preformatted-text": "预格式文本 / 代码块（缩进风格）",
                    "code-block": "代码块（多语言风格）",
                    table: "添加表格",
                    datetime: "日期时间",
                    emoji: "Emoji表情",
                    "html-entities": "HTML实体字符",
                    pagebreak: "插入分页符",
                    "goto-line": "跳转到行",
                    watch: "关闭实时预览",
                    unwatch: "开启实时预览",
                    preview: "全窗口预览HTML（按 Shift + ESC还原）",
                    fullscreen: "全屏（按ESC还原）",
                    clear: "清空",
                    search: "搜索",
                    help: "使用帮助",
                    info: "关于" + t.title
                },
                buttons: {
                    enter: "确定",
                    cancel: "取消",
                    close: "关闭"
                },
                dialog: {
                    link: {
                        title: "添加链接",
                        url: "链接地址",
                        urlTitle: "链接标题",
                        urlEmpty: "错误：请填写链接地址。"
                    },
                    referenceLink: {
                        title: "添加引用链接",
                        name: "引用名称",
                        url: "链接地址",
                        urlId: "链接ID",
                        urlTitle: "链接标题",
                        nameEmpty: "错误：引用链接的名称不能为空。",
                        idEmpty: "错误：请填写引用链接的ID。",
                        urlEmpty: "错误：请填写引用链接的URL地址。"
                    },
                    image: {
                        title: "添加图片",
                        url: "图片地址",
                        link: "图片链接",
                        alt: "图片描述",
                        uploadButton: "本地上传",
                        imageURLEmpty: "错误：图片地址不能为空。",
                        uploadFileEmpty: "错误：上传的图片不能为空。",
                        formatNotAllowed: "错误：只允许上传图片文件，允许上传的图片文件格式有："
                    },
                    preformattedText: {
                        title: "添加预格式文本或代码块",
                        emptyAlert: "错误：请填写预格式文本或代码的内容。",
                        placeholder       : "输入文字...."
                    },
                    codeBlock: {
                        title: "添加代码块",
                        selectLabel: "代码语言：",
                        selectDefaultText: "请选择代码语言",
                        otherLanguage: "其他语言",
                        unselectedLanguageAlert: "错误：请选择代码所属的语言类型。",
                        codeEmptyAlert: "错误：请填写代码内容。",
                        placeholder       : "输入代码...."
                    },
                    htmlEntities: {
                        title: "HTML 实体字符"
                    },
                    help: {
                        title: "使用帮助"
                    }
                }
            }
        }, t.classNames = {
            tex: t.classPrefix + "tex"
        }, t.dialogZindex = 99999, t.$katex = null, t.$marked = null, t.$CodeMirror = null, t.$prettyPrint = null;
        var i, o;
        t.prototype = t.fn = {
            state: {
                watching: !1,
                loaded: !1,
                preview: !1,
                fullscreen: !1
            },
            init: function(i, o) {
                o = o || {}, "object" == typeof i && (o = i);
                var r = this.classPrefix = t.classPrefix,
                    n = this.settings = e.extend(!0, t.defaults, o);
                i = "object" == typeof i ? n.id : i;
                var a = this.editor = e("#" + i);
                this.id = i, this.lang = n.lang;
                var s = this.classNames = {
                    textarea: {
                        html: r + "html-textarea",
                        markdown: r + "markdown-textarea"
                    }
                };
                n.pluginPath = "" === n.pluginPath ? n.path + "../plugins/" : n.pluginPath, this.state.watching = n.watch ? !0 : !1, a.hasClass("editormd") || a.addClass("editormd"), a.css({
                    width: "number" == typeof n.width ? n.width + "px" : n.width,
                    height: "number" == typeof n.height ? n.height + "px" : n.height
                }), n.autoHeight && a.css("height", "auto");
                var l = this.markdownTextarea = a.children("textarea");
                l.length < 1 && (a.append("<textarea></textarea>"), l = this.markdownTextarea = a.children("textarea")), l.addClass(s.textarea.markdown).attr("placeholder", n.placeholder), ("undefined" == typeof l.attr("name") || "" === l.attr("name")) && l.attr("name", "" !== n.name ? n.name : i + "-markdown-doc");
                var c = [n.readOnly ? "" : '<a href="javascript:;" onclick="togglefullscreen()" class="fa fa-arrows-alt editormd-fullscreen-btn"></a><a href="javascript:;" class="fa fa-edit ' + r + 'preview-close-btn"></a>', n.saveHTMLToTextarea ? '<textarea class="' + s.textarea.html + '" name="' + i + '-html-code"></textarea>' : "", '<div class="' + r + 'preview"><div class="markdown-body ' + r + 'preview-container"></div></div>', '<div class="' + r + 'container-mask" style="display:block;"></div>', '<div class="' + r + 'mask"></div>'].join("\n");
                return a.append(c).addClass(r + "vertical"), "" !== n.theme && a.addClass(r + "theme-" + n.theme), this.mask = a.children("." + r + "mask"), this.containerMask = a.children("." + r + "container-mask"), "" !== n.markdown && l.val(n.markdown), "" !== n.appendMarkdown && l.val(l.val() + n.appendMarkdown), this.htmlTextarea = a.children("." + s.textarea.html), this.preview = a.children("." + r + "preview"), this.previewContainer = this.preview.children("." + r + "preview-container"), "" !== n.previewTheme && this.preview.addClass(r + "preview-theme-" + n.previewTheme), "function" == typeof define && define.amd && ("undefined" != typeof katex && (t.$katex = katex), n.searchReplace && !n.readOnly && (t.loadCSS(n.path + "codemirror/addon/dialog/dialog"), t.loadCSS(n.path + "codemirror/addon/search/matchesonscrollbar"))), "function" == typeof define && define.amd || !n.autoLoadModules ? ("undefined" != typeof CodeMirror && (t.$CodeMirror = CodeMirror), "undefined" != typeof marked && (t.$marked = marked), this.setCodeMirror().setToolbar().loadedDisplay()) : this.loadQueues(), this
            },
            loadQueues: function() {
                var e = this,
                    i = this.settings,
                    o = i.path,
                    r = function() {
                        return t.isIE8 ? void e.loadedDisplay() : void(i.flowChart || i.sequenceDiagram ? t.loadScript(o + "raphael.min", function() {
                            t.loadScript(o + "underscore.min", function() {
                                !i.flowChart && i.sequenceDiagram ? t.loadScript(o + "sequence-diagram.min", function() {
                                    e.loadedDisplay()
                                }) : i.flowChart && !i.sequenceDiagram ? t.loadScript(o + "flowchart.min", function() {
                                    t.loadScript(o + "jquery.flowchart.min", function() {
                                        e.loadedDisplay()
                                    })
                                }) : i.flowChart && i.sequenceDiagram && t.loadScript(o + "flowchart.min", function() {
                                    t.loadScript(o + "jquery.flowchart.min", function() {
                                        t.loadScript(o + "sequence-diagram.min", function() {
                                            e.loadedDisplay()
                                        })
                                    })
                                })
                            })
                        }) : e.loadedDisplay())
                    };
                return t.loadCSS(o + "codemirror/codemirror.min"), i.searchReplace && !i.readOnly && (t.loadCSS(o + "codemirror/addon/dialog/dialog"), t.loadCSS(o + "codemirror/addon/search/matchesonscrollbar")), i.codeFold && t.loadCSS(o + "codemirror/addon/fold/foldgutter"), t.loadScript(o + "codemirror/codemirror.min", function() {
                    t.$CodeMirror = CodeMirror, t.loadScript(o + "codemirror/modes.min", function() {
                        t.loadScript(o + "codemirror/addons.min", function() {
                            return e.setCodeMirror(), "gfm" !== i.mode && "markdown" !== i.mode ? (e.loadedDisplay(), !1) : (e.setToolbar(), void t.loadScript(o + "marked.min", function() {
                                t.$marked = marked, i.previewCodeHighlight ? t.loadScript(o + "prettify.min", function() {
                                    r()
                                }) : r()
                            }))
                        })
                    })
                }), this
            },
            setTheme: function(e) {
                var t = this.editor,
                    i = this.settings.theme,
                    o = this.classPrefix + "theme-";
                return t.removeClass(o + i).addClass(o + e), this.settings.theme = e, this
            },
            setEditorTheme: function(e) {
                var i = this.settings;
                return i.editorTheme = e, "default" !== e && t.loadCSS(i.path + "codemirror/theme/" + i.editorTheme), this.cm.setOption("theme", e), this
            },
            setCodeMirrorTheme: function(e) {
                return this.setEditorTheme(e), this
            },
            setPreviewTheme: function(e) {
                var t = this.preview,
                    i = this.settings.previewTheme,
                    o = this.classPrefix + "preview-theme-";
                return t.removeClass(o + i).addClass(o + e), this.settings.previewTheme = e, this
            },
            setCodeMirror: function() {
                var e = this.settings,
                    i = this.editor;
                "default" !== e.editorTheme && t.loadCSS(e.path + "codemirror/theme/" + e.editorTheme);
                var o = {
                    mode: e.mode,
                    theme: e.editorTheme,
                    tabSize: e.tabSize,
                    dragDrop: !1,
                    autofocus: e.autoFocus,
                    autoCloseTags: e.autoCloseTags,
                    readOnly: e.readOnly ? "nocursor" : !1,
                    indentUnit: e.indentUnit,
                    lineNumbers: e.lineNumbers,
                    lineWrapping: e.lineWrapping,
                    extraKeys: {
                        "Ctrl-Q": function(e) {
                            e.foldCode(e.getCursor())
                        }
                    },
                    foldGutter: e.codeFold,
                    gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"],
                    matchBrackets: e.matchBrackets,
                    indentWithTabs: e.indentWithTabs,
                    styleActiveLine: e.styleActiveLine,
                    styleSelectedText: e.styleSelectedText,
                    autoCloseBrackets: e.autoCloseBrackets,
                    showTrailingSpace: e.showTrailingSpace,
                    highlightSelectionMatches: e.matchWordHighlight ? {
                        showToken: "onselected" === e.matchWordHighlight ? !1 : /\w/
                    } : !1
                };
                return this.codeEditor = this.cm = t.$CodeMirror.fromTextArea(this.markdownTextarea[0], o), this.codeMirror = this.cmElement = i.children(".CodeMirror"), "" !== e.value && this.cm.setValue(e.value), this.codeMirror.css({
                    fontSize: e.fontSize,
                    width: e.watch ? "50%" : "100%"
                }), e.autoHeight && (this.codeMirror.css("height", "auto"), this.cm.setOption("viewportMargin", 1 / 0)), e.lineNumbers || this.codeMirror.find(".CodeMirror-gutters").css("border-right", "none"), this
            },
            getCodeMirrorOption: function(e) {
                return this.cm.getOption(e)
            },
            setCodeMirrorOption: function(e, t) {
                return this.cm.setOption(e, t), this
            },
            addKeyMap: function(e, t) {
                return this.cm.addKeyMap(e, t), this
            },
            removeKeyMap: function(e) {
                return this.cm.removeKeyMap(e), this
            },
            gotoLine: function(t) {
                var i = this.settings;
                if (!i.gotoLine) return this;
                var o = this.cm,
                    r = (this.editor, o.lineCount()),
                    n = this.preview;
                if ("string" == typeof t && ("last" === t && (t = r), "first" === t && (t = 1)), "number" != typeof t) return alert("Error: The line number must be an integer."), this;
                if (t = parseInt(t) - 1, t > r) return alert("Error: The line number range 1-" + r), this;
                o.setCursor({
                    line: t,
                    ch: 0
                });
                var a = o.getScrollInfo(),
                    s = a.clientHeight,
                    l = o.charCoords({
                        line: t,
                        ch: 0
                    }, "local");
                if (o.scrollTo(null, (l.top + l.bottom - s) / 2), i.watch) {
                    var c = this.codeMirror.find(".CodeMirror-scroll")[0],
                        h = e(c).height(),
                        d = c.scrollTop,
                        u = d / c.scrollHeight;
                    n.scrollTop(0 === d ? 0 : d + h >= c.scrollHeight - 16 ? n[0].scrollHeight : n[0].scrollHeight * u)
                }
                return o.focus(), this
            },
            extend: function() {
                return "undefined" != typeof arguments[1] && ("function" == typeof arguments[1] && (arguments[1] = e.proxy(arguments[1], this)), this[arguments[0]] = arguments[1]), "object" == typeof arguments[0] && "undefined" == typeof arguments[0].length && e.extend(!0, this, arguments[0]), this
            },
            set: function(t, i) {
                return "undefined" != typeof i && "function" == typeof i && (i = e.proxy(i, this)), this[t] = i, this
            },
            config: function(t, i) {
                var o = this.settings;
                return "object" == typeof t && (o = e.extend(!0, o, t)), "string" == typeof t && (o[t] = i), this.settings = o, this.recreate(), this
            },
            on: function(t, i) {
                var o = this.settings;
                return "undefined" != typeof o["on" + t] && (o["on" + t] = e.proxy(i, this)), this
            },
            off: function(e) {
                var t = this.settings;
                return "undefined" != typeof t["on" + e] && (t["on" + e] = function() {}), this
            },
            showToolbar: function(t) {
                var i = this.settings;
                return i.readOnly ? this : (i.toolbar && (this.toolbar.length < 1 || "" === this.toolbar.find("." + this.classPrefix + "menu").html()) && this.setToolbar(), i.toolbar = !0, this.toolbar.show(), this.resize(), e.proxy(t || function() {}, this)(), this)
            },
            hideToolbar: function(t) {
            	return false;
                var i = this.settings;
                return i.toolbar = !1, this.toolbar.hide(), this.resize(), e.proxy(t || function() {}, this)(), this
            },
            setToolbarAutoFixed: function(t) {
                var i = this.state,
                    o = this.editor,
                    r = this.toolbar,
                    n = this.settings;
                "undefined" != typeof t && (n.toolbarAutoFixed = t);
                var a = function() {
                    var t = e(window),
                        i = t.scrollTop();
                    return n.toolbarAutoFixed ? void r.css(i - o.offset().top > 10 && i < o.height() ? {
                        position: "fixed",
                        width: o.width() + "px",
                        left: (t.width() - o.width()) / 2 + "px"
                    } : {
                        position: "absolute",
                        width: "100%",
                        left: 0
                    }) : !1
                };
                return !i.fullscreen && !i.preview && n.toolbar && n.toolbarAutoFixed && e(window).bind("scroll", a), this
            },
            setToolbar: function() {
                var e = this.settings;
                if (e.readOnly) return this;
                var i = this.editor,
                    o = (this.preview, this.classPrefix),
                    r = this.toolbar = i.children("." + o + "toolbar");
                if (e.toolbar && r.length < 1) {
                    var n = '<div class="' + o + 'toolbar"><div class="' + o + 'toolbar-container"><ul class="' + o + 'menu"></ul></div></div>';
                    i.append(n), r = this.toolbar = i.children("." + o + "toolbar")
                }
                if (!e.toolbar) return r.hide(), this;
                r.show();
                for (var a = "function" == typeof e.toolbarIcons ? e.toolbarIcons() : "string" == typeof e.toolbarIcons ? t.toolbarModes[e.toolbarIcons] : e.toolbarIcons, s = r.find("." + this.classPrefix + "menu"), l = "", c = !1, h = 0, d = a.length; d > h; h++) {
                    var u = a[h];
                    if ("||" === u) c = !0;
                    else if ("|" === u) l += '<li class="divider" unselectable="on">|</li>';
                    else {
                        var f = /h(\d)/.test(u),
                            g = u;
                        "watch" !== u || e.watch || (g = "unwatch");
                        var p = e.lang.toolbar[g],
                            m = e.toolbarIconTexts[g],
                            w = e.toolbarIconsClass[g];
                        p = "undefined" == typeof p ? "" : p, m = "undefined" == typeof m ? "" : m, w = "undefined" == typeof w ? "" : w;
                        var v = c ? '<li class="pull-right">' : "<li>";
                        "undefined" != typeof e.toolbarCustomIcons[u] && "function" != typeof e.toolbarCustomIcons[u] ? v += e.toolbarCustomIcons[u] : (v += '<a href="javascript:;" title="' + p + '" unselectable="on">', v += '<i class="fa ' + w + '" name="' + u + '" unselectable="on">' + (f ? u.toUpperCase() : "" === w ? m : "") + "</i>", v += "</a>"), v += "</li>", l = c ? v + l : l + v
                    }
                }
                return s.html(l), s.find('[title="Lowercase"]').attr("title", e.lang.toolbar.lowercase), s.find('[title="ucwords"]').attr("title", e.lang.toolbar.ucwords), this.setToolbarHandler(), this.setToolbarAutoFixed(), this
            },
            dialogLockScreen: function() {
                return e.proxy(t.dialogLockScreen, this)(), this
            },
            dialogShowMask: function(i) {
                return e.proxy(t.dialogShowMask, this)(i), this
            },
            getToolbarHandles: function(e) {
                var i = this.toolbarHandlers = t.toolbarHandlers;
                return e && "undefined" != typeof toolbarIconHandlers[e] ? i[e] : i
            },
            setToolbarHandler: function() {
                var i = this,
                    o = this.settings;
                if (!o.toolbar || o.readOnly) return this;
                var r = this.toolbar,
                    n = this.cm,
                    a = this.classPrefix,
                    s = this.toolbarIcons = r.find("." + a + "menu > li > a"),
                    l = this.getToolbarHandles();
                return s.bind(t.mouseOrTouch("click", "touchend"), function(t) {
                    var r = e(this).children(".fa"),
                        a = r.attr("name"),
                        s = n.getCursor(),
                        c = n.getSelection();
                    return "" !== a ? (i.activeIcon = r, "undefined" != typeof l[a] ? e.proxy(l[a], i)(n) : "undefined" != typeof o.toolbarHandlers[a] && e.proxy(o.toolbarHandlers[a], i)(n, r, s, c), "link" !== a && "reference-link" !== a && "image" !== a && "code-block" !== a && "preformatted-text" !== a && "watch" !== a && "preview" !== a && "search" !== a && "fullscreen" !== a && "info" !== a && n.focus(), !1) : void 0
                }), this
            },
            createDialog: function(i) {
                return e.proxy(t.createDialog, this)(i)
            },
            createInfoDialog: function() {
                var e = this,
                    i = this.editor,
                    o = this.classPrefix,
                    r = ['<div class="' + o + "dialog " + o + 'dialog-info" style="">', '<div class="' + o + 'dialog-container">', '<h1><i class="editormd-logo editormd-logo-lg editormd-logo-color"></i> ' + t.title + "<small>v" + t.version + "</small></h1>", "<p>" + this.lang.description + "</p>", '<p style="margin: 10px 0 20px 0;"><a href="' + t.homePage + '" target="_blank">' + t.homePage + ' <i class="fa fa-external-link"></i></a></p>', '<p style="font-size: 0.85em;">Copyright &copy; 2015 <a href="https://github.com/pandao" target="_blank" class="hover-link">Pandao</a>, The <a href="https://github.com/pandao/editor.md/blob/master/LICENSE" target="_blank" class="hover-link">MIT</a> License.</p>', "</div>", '<a href="javascript:;" class="fa fa-close ' + o + 'dialog-close"></a>', "</div>"].join("\n");
                i.append(r);
                var n = this.infoDialog = i.children("." + o + "dialog-info");
                return n.find("." + o + "dialog-close").bind(t.mouseOrTouch("click", "touchend"), function() {
                    e.hideInfoDialog()
                }), n.css("border", t.isIE8 ? "1px solid #ddd" : "").css("z-index", t.dialogZindex).show(), this.infoDialogPosition(), this
            },
            infoDialogPosition: function() {
                var t = this.infoDialog,
                    i = function() {
                        t.css({
                            top: (e(window).height() - t.height()) / 2 + "px",
                            left: (e(window).width() - t.width()) / 2 + "px"
                        })
                    };
                return i(), e(window).resize(i), this
            },
            showInfoDialog: function() {
                e("html,body").css("overflow-x", "hidden");
                var i = this.editor,
                    o = this.settings,
                    r = this.infoDialog = i.children("." + this.classPrefix + "dialog-info");
                return r.length < 1 && this.createInfoDialog(), this.lockScreen(!0), this.mask.css({
                    opacity: o.dialogMaskOpacity,
                    backgroundColor: o.dialogMaskBgColor
                }).show(), r.css("z-index", t.dialogZindex).show(), this.infoDialogPosition(), this
            },
            hideInfoDialog: function() {
                return e("html,body").css("overflow-x", ""), this.infoDialog.hide(), this.mask.hide(), this.lockScreen(!1), this
            },
            lockScreen: function(e) {
                return t.lockScreen(e), this.resize(), this
            },
            recreate: function() {
                var e = this.editor,
                    t = this.settings;
                return this.codeMirror.remove(), this.setCodeMirror(), t.readOnly || (e.find(".editormd-dialog").length > 0 && e.find(".editormd-dialog").remove(), t.toolbar && (this.getToolbarHandles(), this.setToolbar())), this.loadedDisplay(!0), this
            },
            previewCodeHighlight: function() {
                var e = this.settings,
                    t = this.previewContainer;
                return e.previewCodeHighlight && (t.find("pre").addClass("prettyprint linenums").before('<b onclick="run_previewcode(this)" class="run_previewcode"  >运行</b>'), "undefined" != typeof prettyPrint && prettyPrint()), this
            },
            katexRender: function() {
                return null === i ? this : (this.previewContainer.find("." + t.classNames.tex).each(function() {
                    var i = e(this);
                    t.$katex.render(i.text(), i[0]), i.find(".katex").css("font-size", "1.6em")
                }), this)
            },
            flowChartAndSequenceDiagramRender: function() {
                var i = this,
                    r = this.settings,
                    n = this.previewContainer;
                if (t.isIE8) return this;
                if (r.flowChart) {
                    if (null === o) return this;
                    n.find(".flowchart").flowChart()
                }
                r.sequenceDiagram && n.find(".sequence-diagram").sequenceDiagram({
                    theme: "simple"
                });
                var a = i.preview,
                    s = i.codeMirror,
                    l = s.find(".CodeMirror-scroll"),
                    c = l.height(),
                    h = l.scrollTop(),
                    d = h / l[0].scrollHeight,
                    u = 0;
                a.find(".markdown-toc-list").each(function() {
                    u += e(this).height()
                });
                var f = a.find(".editormd-toc-menu").height();
                return f = f ? f : 0, a.scrollTop(0 === h ? 0 : h + c >= l[0].scrollHeight - 16 ? a[0].scrollHeight : (a[0].scrollHeight + u + f) * d), this
            },
            registerKeyMaps: function(i) {
                var o = this,
                    r = this.cm,
                    n = this.settings,
                    a = t.toolbarHandlers,
                    s = n.disabledKeyMaps;
                if (i = i || null) {
                    for (var l in i)
                        if (e.inArray(l, s) < 0) {
                            var c = {};
                            c[l] = i[l], r.addKeyMap(i)
                        }
                } else {
                    for (var h in t.keyMaps) {
                        var d = t.keyMaps[h],
                            u = "string" == typeof d ? e.proxy(a[d], o) : e.proxy(d, o);
                        if (e.inArray(h, ["F9", "F10", "F11"]) < 0 && e.inArray(h, s) < 0) {
                            var f = {};
                            f[h] = u, r.addKeyMap(f)
                        }
                    }
                    e(window).keydown(function(t) {
                        var i = {
                            120: "F9",
                            121: "F10",
                            122: "F11"
                        };
                        if (e.inArray(i[t.keyCode], s) < 0) switch (t.keyCode) {
                            case 120:
                                return e.proxy(a.watch, o)(), !1;
                            case 121:
                                return e.proxy(a.preview, o)(), !1;
                            case 122:
                                return e.proxy(a.fullscreen, o)(), !1
                        }
                    })
                }
                return this
            },
            bindScrollEvent: function() {
                var i = this,
                    o = this.preview,
                    r = this.settings,
                    n = this.codeMirror,
                    a = t.mouseOrTouch;
                if (!r.syncScrolling) return this;
                var s = function() {
                        n.find(".CodeMirror-scroll").bind(a("scroll", "touchmove"), function(t) {
                            var n = e(this).height(),
                                a = e(this).scrollTop(),
                                s = a / e(this)[0].scrollHeight,
                                l = 0;
                            o.find(".markdown-toc-list").each(function() {
                                l += e(this).height()
                            });
                            var c = o.find(".editormd-toc-menu").height();
                            c = c ? c : 0, o.scrollTop(0 === a ? 0 : a + n >= e(this)[0].scrollHeight - 16 ? o[0].scrollHeight : (o[0].scrollHeight + l + c) * s), e.proxy(r.onscroll, i)(t)
                        })
                    },
                    l = function() {
                        n.find(".CodeMirror-scroll").unbind(a("scroll", "touchmove"))
                    },
                    c = function() {
                        o.bind(a("scroll", "touchmove"), function(t) {
                            var o = e(this).height(),
                                a = e(this).scrollTop(),
                                s = a / e(this)[0].scrollHeight,
                                l = n.find(".CodeMirror-scroll");
                            l.scrollTop(0 === a ? 0 : a + o >= e(this)[0].scrollHeight ? l[0].scrollHeight : l[0].scrollHeight * s), e.proxy(r.onpreviewscroll, i)(t)
                        })
                    },
                    h = function() {
                        o.unbind(a("scroll", "touchmove"))
                    };
                return n.bind({
                    mouseover: s,
                    mouseout: l,
                    touchstart: s,
                    touchend: l
                }), "single" === r.syncScrolling ? this : (o.bind({
                    mouseover: c,
                    mouseout: h,
                    touchstart: c,
                    touchend: h
                }), this)
            },
            bindChangeEvent: function() {
                var e = this,
                    t = this.cm,
                    o = this.settings;
                return o.syncScrolling ? (t.on("change", function(t, r) {
                    o.watch && e.previewContainer.css("padding", o.autoHeight ? "20px 20px 50px 40px" : "20px"), i = setTimeout(function() {
                        clearTimeout(i), e.save(), i = null
                    }, o.delay)
                }), this) : this
            },
            loadedDisplay: function(t) {
                t = t || !1;
                var i = this,
                    o = this.editor,
                    r = this.preview,
                    n = this.settings;
                return this.containerMask.hide(), this.save(), n.watch && r.show(), o.data("oldWidth", o.width()).data("oldHeight", o.height()), this.resize(), this.registerKeyMaps(), e(window).resize(function() {
                    i.resize()
                }), this.bindScrollEvent().bindChangeEvent(), t || e.proxy(n.onload, this)(), this.state.loaded = !0, this
            },
            width: function(e) {
                return this.editor.css("width", "number" == typeof e ? e + "px" : e), this.resize(), this
            },
            height: function(e) {
                return this.editor.css("height", "number" == typeof e ? e + "px" : e), this.resize(), this
            },
            resize: function(t, i) {
                t = t || null, i = i || null;
                var o = this.state,
                    r = this.editor,
                    n = this.preview,
                    a = this.toolbar,
                    s = this.settings,
                    l = this.codeMirror;
                if (t && r.css("width", "number" == typeof t ? t + "px" : t), !s.autoHeight || o.fullscreen || o.preview ? (i && r.css("height", "number" == typeof i ? i + "px" : i), o.fullscreen && r.height(e(window).height()), s.toolbar && !s.readOnly ? l.css("margin-top", a.height() + 1).height(r.height() - a.height()) : l.css("margin-top", 0).height(r.height())) : (r.css("height", "auto"), l.css("height", "auto")), s.watch)
                    if (l.width(r.width() / 2), n.width(o.preview ? r.width() : r.width() / 2), this.previewContainer.css("padding", s.autoHeight ? "20px 20px 50px 40px" : "20px"), s.toolbar && !s.readOnly ? n.css("top", a.height() + 1) : n.css("top", 0), !s.autoHeight || o.fullscreen || o.preview) {
                        var c = s.toolbar && !s.readOnly ? r.height() - a.height() : r.height();
                        n.height(c)
                    } else n.height("");
                else l.width(r.width()), n.hide();
                return o.loaded && e.proxy(s.onresize, this)(), this
            },
            save: function() {
                if (null === i) return this;
                var r = this,
                    n = this.state,
                    a = this.settings,
                    s = this.cm,
                    l = s.getValue(),
                    c = this.previewContainer;
                if ("gfm" !== a.mode && "markdown" !== a.mode) return this.markdownTextarea.val(l), this;
                var h = t.$marked,
                    d = this.markdownToC = [],
                    u = this.markedRendererOptions = {
                        toc: a.toc,
                        tocm: a.tocm,
                        tocStartLevel: a.tocStartLevel,
                        pageBreak: a.pageBreak,
                        taskList: a.taskList,
                        emoji: a.emoji,
                        tex: a.tex,
                        atLink: a.atLink,
                        emailLink: a.emailLink,
                        flowChart: a.flowChart,
                        sequenceDiagram: a.sequenceDiagram,
                        previewCodeHighlight: a.previewCodeHighlight
                    },
                    f = this.markedOptions = {
                        renderer: t.markedRenderer(d, u),
                        gfm: !0,
                        tables: !0,
                        breaks: !0,
                        pedantic: !1,
                        sanitize: a.htmlDecode ? !1 : !0,
                        smartLists: !0,
                        smartypants: !0
                    };
                h.setOptions(f);
                var g = t.$marked(l, f);
                if (g = t.filterHTMLTags(g, a.htmlDecode), this.markdownTextarea.text(l), s.save(), a.saveHTMLToTextarea && this.htmlTextarea.text(g), a.watch || !a.watch && n.preview) {
                    if (c.html(g), this.previewCodeHighlight(), a.toc) {
                        var p = "" === a.tocContainer ? c : e(a.tocContainer),
                            m = p.find("." + this.classPrefix + "toc-menu");
                        p.attr("previewContainer", "" === a.tocContainer ? "true" : "false"), "" !== a.tocContainer && m.length > 0 && m.remove(), t.markdownToCRenderer(d, p, a.tocDropdown, a.tocStartLevel), (a.tocDropdown || p.find("." + this.classPrefix + "toc-menu").length > 0) && t.tocDropdownMenu(p, "" !== a.tocTitle ? a.tocTitle : this.lang.tocTitle), "" !== a.tocContainer && c.find(".markdown-toc").css("border", "none")
                    }
                    a.tex && (!t.kaTeXLoaded && a.autoLoadModules ? t.loadKaTeX(function() {
                        t.$katex = katex, t.kaTeXLoaded = !0, r.katexRender()
                    }) : (t.$katex = katex, this.katexRender())), (a.flowChart || a.sequenceDiagram) && (o = setTimeout(function() {
                        clearTimeout(o), r.flowChartAndSequenceDiagramRender(), o = null
                    }, 10)), n.loaded && e.proxy(a.onchange, this)()
                }
                return this
            },
            focus: function() {
                return this.cm.focus(), this
            },
            setCursor: function(e) {
                return this.cm.setCursor(e), this
            },
            getCursor: function() {
                return this.cm.getCursor()
            },
            setSelection: function(e, t) {
                return this.cm.setSelection(e, t), this
            },
            getSelection: function() {
                return this.cm.getSelection()
            },
            setSelections: function(e) {
                return this.cm.setSelections(e), this
            },
            getSelections: function() {
                return this.cm.getSelections()
            },
            replaceSelection: function(e) {
                return this.cm.replaceSelection(e), this
            },
            insertValue: function(e) {
                return this.replaceSelection(e), this
            },
            appendMarkdown: function(e) {
                var t = (this.settings, this.cm);
                return t.setValue(t.getValue() + e), this
            },
            setMarkdown: function(e) {
                return this.cm.setValue(e || this.settings.markdown), this
            },
            getMarkdown: function() {
                return this.cm.getValue()
            },
            getValue: function() {
                return this.cm.getValue()
            },
            setValue: function(e) {
                return this.cm.setValue(e), this
            },
            clear: function() {
                return this.cm.setValue(""), this
            },
            getHTML: function() {
                return this.settings.saveHTMLToTextarea ? this.htmlTextarea.val() : (alert("Error: settings.saveHTMLToTextarea == false"), !1)
            },
            getTextareaSavedHTML: function() {
                return this.getHTML()
            },
            getPreviewedHTML: function() {
                return this.settings.watch ? this.previewContainer.html() : (alert("Error: settings.watch == false"), !1)
            },
            watch: function(t) {
                var o = this.settings;
                if (e.inArray(o.mode, ["gfm", "markdown"]) < 0) return this;
                if (this.state.watching = o.watch = !0, this.preview.show(), this.toolbar) {
                    var r = o.toolbarIconsClass.watch,
                        n = o.toolbarIconsClass.unwatch,
                        a = this.toolbar.find(".fa[name=watch]");
                    a.parent().attr("title", o.lang.toolbar.watch), a.removeClass(n).addClass(r)
                }
                return this.codeMirror.css("border-right", "1px solid #ddd").width(this.editor.width() / 2), i = 0, this.save().resize(), o.onwatch || (o.onwatch = t || function() {}), e.proxy(o.onwatch, this)(), this
            },
            unwatch: function(t) {
                var i = this.settings;
                if (this.state.watching = i.watch = !1, this.preview.hide(), this.toolbar) {
                    var o = i.toolbarIconsClass.watch,
                        r = i.toolbarIconsClass.unwatch,
                        n = this.toolbar.find(".fa[name=watch]");
                    n.parent().attr("title", i.lang.toolbar.unwatch), n.removeClass(o).addClass(r)
                }
                return this.codeMirror.css("border-right", "none").width(this.editor.width()), this.resize(), i.onunwatch || (i.onunwatch = t || function() {}), e.proxy(i.onunwatch, this)(), this
            },
            show: function(t) {
                t = t || function() {};
                var i = this;
                return this.editor.show(0, function() {
                    e.proxy(t, i)()
                }), this
            },
            hide: function(t) {
                t = t || function() {};
                var i = this;
                return this.editor.hide(0, function() {
                    e.proxy(t, i)()
                }), this
            },
            previewing: function() {
                var i = this,
                    o = this.editor,
                    r = this.preview,
                    n = this.toolbar,
                    a = this.settings,
                    s = this.codeMirror,
                    l = this.previewContainer;
                if (e.inArray(a.mode, ["gfm", "markdown"]) < 0) return this;
                a.toolbar && n && (n.toggle(), n.find(".fa[name=preview]").toggleClass("active")), s.toggle();
                var c = function(e) {
                    e.shiftKey && 27 === e.keyCode && i.previewed()
                };
                "none" === s.css("display") ? (this.state.preview = !0, this.state.fullscreen && r.css("background", "#fff"), o.find("." + this.classPrefix + "preview-close-btn").show().bind(t.mouseOrTouch("click", "touchend"), function() {
                    i.previewed()
                }), a.watch ? l.css("padding", "") : this.save(), l.addClass(this.classPrefix + "preview-active"), r.show().css({
                    position: "",
                    top: 0,
                    width: o.width(),
                    height: a.autoHeight && !this.state.fullscreen ? "auto" : o.height()
                }), this.state.loaded && e.proxy(a.onpreviewing, this)(), e(window).bind("keyup", c)) : (e(window).unbind("keyup", c), this.previewed())
            },
            previewed: function() {
                var i = this.editor,
                    o = this.preview,
                    r = this.toolbar,
                    n = this.settings,
                    a = this.previewContainer,
                    s = i.find("." + this.classPrefix + "preview-close-btn");
                return this.state.preview = !1, this.codeMirror.show(), n.toolbar && r.show(), o[n.watch ? "show" : "hide"](), s.hide().unbind(t.mouseOrTouch("click", "touchend")), a.removeClass(this.classPrefix + "preview-active"), n.watch && a.css("padding", "20px"), o.css({
                    background: null,
                    position: "absolute",
                    width: i.width() / 2,
                    height: n.autoHeight && !this.state.fullscreen ? "auto" : i.height() - r.height(),
                    top: n.toolbar ? r.height() : 0
                }), this.state.loaded && e.proxy(n.onpreviewed, this)(), this
            },
            fullscreen: function() {
                var t = this,
                    i = this.state,
                    o = this.editor,
                    r = (this.preview, this.toolbar),
                    n = this.settings,
                    a = this.classPrefix + "fullscreen";
                r && r.find(".fa[name=fullscreen]").parent().toggleClass("active");
                var s = function(e) {
                    e.shiftKey || 27 !== e.keyCode || i.fullscreen && t.fullscreenExit()
                };
                return o.hasClass(a) ? (e(window).unbind("keyup", s), this.fullscreenExit()) : (i.fullscreen = !0, e("html,body").css("overflow", "hidden"), o.css({
                	top:0,
                    width: e(window).width(),
                    height: e(window).height()
                }).addClass(a), this.resize(), e.proxy(n.onfullscreen, this)(), e(window).bind("keyup", s)), this
            },
            fullscreenExit: function() {
                var t = this.editor,
                    i = this.settings,
                    o = this.toolbar,
                    r = this.classPrefix + "fullscreen";
                return this.state.fullscreen = !1, o && o.find(".fa[name=fullscreen]").parent().removeClass("active"), e("html,body").css("overflow", ""), t.css({
                	top:0,
                    width: t.data("oldWidth"),
                    height: t.data("oldHeight")
                }).removeClass(r), this.resize(), e.proxy(i.onfullscreenExit, this)(), this
            },
            executePlugin: function(i, o) {
                var r = this,
                    n = this.cm,
                    a = this.settings;
                return o = a.pluginPath + o, "function" == typeof define ? "undefined" == typeof this[i] ? (alert("Error: " + i + " plugin is not found, you are not load this plugin."), this) : (this[i](n), this) : (e.inArray(o, t.loadFiles.plugin) < 0 ? t.loadPlugin(o, function() {
                    t.loadPlugins[i] = r[i], r[i](n)
                }) : e.proxy(t.loadPlugins[i], this)(n), this)
            },
            search: function(e) {
                var t = this.settings;
                return t.searchReplace ? (t.readOnly || this.cm.execCommand(e || "find"), this) : (alert("Error: settings.searchReplace == false"), this)
            },
            searchReplace: function() {
                return this.search("replace"), this
            },
            searchReplaceAll: function() {
                return this.search("replaceAll"), this
            }
        }, t.fn.init.prototype = t.fn, t.dialogLockScreen = function() {
            var t = this.settings || {
                dialogLockScreen: !0
            };
            t.dialogLockScreen && (e("html,body").css("overflow", "hidden"), this.resize())
        }, t.dialogShowMask = function(t) {
            var i = this.editor,
                o = this.settings || {
                    dialogShowMask: !0
                };
            t.css({
                top: (e(window).height() - t.height()) / 2 + "px",
                left: (e(window).width() - t.width()) / 2 + "px"
            }), o.dialogShowMask && i.children("." + this.classPrefix + "mask").css("z-index", parseInt(t.css("z-index")) - 1).show()
        }, t.toolbarHandlers = {
            undo: function() {
                this.cm.undo()
            },
            redo: function() {
                this.cm.redo()
            },
            bold: function() {
                var e = this.cm,
                    t = e.getCursor(),
                    i = e.getSelection();
                e.replaceSelection("**" + i + "**"), "" === i && e.setCursor(t.line, t.ch + 2)
            },
            del: function() {
                var e = this.cm,
                    t = e.getCursor(),
                    i = e.getSelection();
                e.replaceSelection("~~" + i + "~~"), "" === i && e.setCursor(t.line, t.ch + 2)
            },
            italic: function() {
                var e = this.cm,
                    t = e.getCursor(),
                    i = e.getSelection();
                e.replaceSelection("*" + i + "*"), "" === i && e.setCursor(t.line, t.ch + 1)
            },
            quote: function() {
                var e = this.cm,
                    t = e.getCursor(),
                    i = e.getSelection();
                0 !== t.ch ? (e.setCursor(t.line, 0), e.replaceSelection("> " + i), e.setCursor(t.line, t.ch + 2)) : e.replaceSelection("> " + i)
            },
            ucfirst: function() {
                var e = this.cm,
                    i = e.getSelection(),
                    o = e.listSelections();
                e.replaceSelection(t.firstUpperCase(i)), e.setSelections(o)
            },
            ucwords: function() {
                var e = this.cm,
                    i = e.getSelection(),
                    o = e.listSelections();
                e.replaceSelection(t.wordsFirstUpperCase(i)), e.setSelections(o)
            },
            uppercase: function() {
                var e = this.cm,
                    t = e.getSelection(),
                    i = e.listSelections();
                e.replaceSelection(t.toUpperCase()), e.setSelections(i)
            },
            lowercase: function() {
                var e = this.cm,
                    t = (e.getCursor(), e.getSelection()),
                    i = e.listSelections();
                e.replaceSelection(t.toLowerCase()), e.setSelections(i)
            },
            h1: function() {
                var e = this.cm,
                    t = e.getCursor(),
                    i = e.getSelection();
                0 !== t.ch ? (e.setCursor(t.line, 0), e.replaceSelection("# " + i), e.setCursor(t.line, t.ch + 2)) : e.replaceSelection("# " + i)
            },
            h2: function() {
                var e = this.cm,
                    t = e.getCursor(),
                    i = e.getSelection();
                0 !== t.ch ? (e.setCursor(t.line, 0),
                    e.replaceSelection("## " + i), e.setCursor(t.line, t.ch + 3)) : e.replaceSelection("## " + i)
            },
            h3: function() {
                var e = this.cm,
                    t = e.getCursor(),
                    i = e.getSelection();
                0 !== t.ch ? (e.setCursor(t.line, 0), e.replaceSelection("### " + i), e.setCursor(t.line, t.ch + 4)) : e.replaceSelection("### " + i)
            },
            h4: function() {
                var e = this.cm,
                    t = e.getCursor(),
                    i = e.getSelection();
                0 !== t.ch ? (e.setCursor(t.line, 0), e.replaceSelection("#### " + i), e.setCursor(t.line, t.ch + 5)) : e.replaceSelection("#### " + i)
            },
            h5: function() {
                var e = this.cm,
                    t = e.getCursor(),
                    i = e.getSelection();
                0 !== t.ch ? (e.setCursor(t.line, 0), e.replaceSelection("##### " + i), e.setCursor(t.line, t.ch + 6)) : e.replaceSelection("##### " + i)
            },
            h6: function() {
                var e = this.cm,
                    t = e.getCursor(),
                    i = e.getSelection();
                0 !== t.ch ? (e.setCursor(t.line, 0), e.replaceSelection("###### " + i), e.setCursor(t.line, t.ch + 7)) : e.replaceSelection("###### " + i)
            },
            "list-ul": function() {
                var e = this.cm,
                    t = (e.getCursor(), e.getSelection());
                if ("" === t) e.replaceSelection("- " + t);
                else {
                    for (var i = t.split("\n"), o = 0, r = i.length; r > o; o++) i[o] = "" === i[o] ? "" : "- " + i[o];
                    e.replaceSelection(i.join("\n"))
                }
            },
            "list-ol": function() {
                var e = this.cm,
                    t = (e.getCursor(), e.getSelection());
                if ("" === t) e.replaceSelection("1. " + t);
                else {
                    for (var i = t.split("\n"), o = 0, r = i.length; r > o; o++) i[o] = "" === i[o] ? "" : o + 1 + ". " + i[o];
                    e.replaceSelection(i.join("\n"))
                }
            },
            hr: function() {
                {
                    var e = this.cm,
                        t = e.getCursor();
                    e.getSelection()
                }
                e.replaceSelection((0 !== t.ch ? "\n\n" : "\n") + "------------\n\n")
            },
            tex: function() {
                if (!this.settings.tex) return alert("settings.tex === false"), this;
                var e = this.cm,
                    t = e.getCursor(),
                    i = e.getSelection();
                e.replaceSelection("$$" + i + "$$"), "" === i && e.setCursor(t.line, t.ch + 2)
            },
            link: function() {
                this.executePlugin("linkDialog", "link-dialog/link-dialog")
            },
            "reference-link": function() {
                this.executePlugin("referenceLinkDialog", "reference-link-dialog/reference-link-dialog")
            },
            pagebreak: function() {
                if (!this.settings.pageBreak) return alert("settings.pageBreak === false"), this; {
                    var e = this.cm;
                    e.getSelection()
                }
                e.replaceSelection("\r\n[========]\r\n")
            },
            image: function() {
                this.executePlugin("imageDialog", "image-dialog/image-dialog")
            },
            code: function() {
                var e = this.cm,
                    t = e.getCursor(),
                    i = e.getSelection();
                e.replaceSelection("`" + i + "`"), "" === i && e.setCursor(t.line, t.ch + 1)
            },
            "code-block": function() {
                this.executePlugin("codeBlockDialog", "code-block-dialog/code-block-dialog")
            },
            "preformatted-text": function() {
                this.executePlugin("preformattedTextDialog", "preformatted-text-dialog/preformatted-text-dialog")
            },
            table: function() {
                this.executePlugin("tableDialog", "table-dialog/table-dialog")
            },
            datetime: function() {
                var e = this.cm,
                    i = (e.getSelection(), new Date, this.settings.lang.name),
                    o = t.dateFormat() + " " + t.dateFormat("zh-cn" === i || "zh-tw" === i ? "cn-week-day" : "week-day");
                e.replaceSelection(o)
            },
            emoji: function() {
                this.executePlugin("emojiDialog", "emoji-dialog/emoji-dialog")
            },
            "html-entities": function() {
                this.executePlugin("htmlEntitiesDialog", "html-entities-dialog/html-entities-dialog")
            },
            "goto-line": function() {
                this.executePlugin("gotoLineDialog", "goto-line-dialog/goto-line-dialog")
            },
            watch: function() {
                this[this.settings.watch ? "unwatch" : "watch"]()
            },
            preview: function() {
                this.previewing()
            },
            fullscreen: function() {
                this.fullscreen()
            },
            clear: function() {
                this.clear()
            },
            search: function() {
                this.search()
            },
            help: function() {
                this.executePlugin("helpDialog", "help-dialog/help-dialog")
            },
            info: function() {
                this.showInfoDialog()
            }
        }, t.keyMaps = {
            "Ctrl-1": "h1",
            "Ctrl-2": "h2",
            "Ctrl-3": "h3",
            "Ctrl-4": "h4",
            "Ctrl-5": "h5",
            "Ctrl-6": "h6",
            "Ctrl-B": "bold",
            "Ctrl-D": "datetime",
            "Ctrl-E": function() {
                var e = this.cm,
                    t = e.getCursor(),
                    i = e.getSelection();
                return this.settings.emoji ? (e.replaceSelection(":" + i + ":"), void("" === i && e.setCursor(t.line, t.ch + 1))) : void alert("Error: settings.emoji == false")
            },
            "Ctrl-Alt-G": "goto-line",
            "Ctrl-H": "hr",
            "Ctrl-I": "italic",
            "Ctrl-K": "code",
            "Ctrl-L": function() {
                var e = this.cm,
                    t = e.getCursor(),
                    i = e.getSelection(),
                    o = "" === i ? "" : ' "' + i + '"';
                e.replaceSelection("[" + i + "](" + o + ")"), "" === i && e.setCursor(t.line, t.ch + 1)
            },
            "Ctrl-U": "list-ul",
            "Shift-Ctrl-A": function() {
                var e = this.cm,
                    t = e.getCursor(),
                    i = e.getSelection();
                return this.settings.atLink ? (e.replaceSelection("@" + i), void("" === i && e.setCursor(t.line, t.ch + 1))) : void alert("Error: settings.atLink == false")
            },
            "Shift-Ctrl-C": "code",
            "Shift-Ctrl-Q": "quote",
            "Shift-Ctrl-S": "del",
            "Shift-Ctrl-K": "tex",
            "Shift-Alt-C": function() {
                var e = this.cm,
                    t = e.getCursor(),
                    i = e.getSelection();
                e.replaceSelection(["```", i, "```"].join("\n")), "" === i && e.setCursor(t.line, t.ch + 3)
            },
            "Shift-Ctrl-Alt-C": "code-block",
            "Shift-Ctrl-H": "html-entities",
            "Shift-Alt-H": "help",
            "Shift-Ctrl-E": "emoji",
            "Shift-Ctrl-U": "uppercase",
            "Shift-Alt-U": "ucwords",
            "Shift-Ctrl-Alt-U": "ucfirst",
            "Shift-Alt-L": "lowercase",
            "Shift-Ctrl-I": function() {
                var e = this.cm,
                    t = e.getCursor(),
                    i = e.getSelection(),
                    o = "" === i ? "" : ' "' + i + '"';
                e.replaceSelection("![" + i + "](" + o + ")"), "" === i && e.setCursor(t.line, t.ch + 4)
            },
            "Shift-Ctrl-Alt-I": "image",
            "Shift-Ctrl-L": "link",
            "Shift-Ctrl-O": "list-ol",
            "Shift-Ctrl-P": "preformatted-text",
            "Shift-Ctrl-T": "table",
            "Shift-Alt-P": "pagebreak",
            F9: "watch",
            F10: "preview",
            F11: "fullscreen"
        };
        var r = function(e) {
            return String.prototype.trim ? e.trim() : e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "")
        };
        t.trim = r;
        var n = function(e) {
            return e.toLowerCase().replace(/\b(\w)|\s(\w)/g, function(e) {
                return e.toUpperCase()
            })
        };
        t.ucwords = t.wordsFirstUpperCase = n;
        var a = function(e) {
            return e.toLowerCase().replace(/\b(\w)/, function(e) {
                return e.toUpperCase()
            })
        };
        return t.firstUpperCase = t.ucfirst = a, t.urls = {
            atLinkBase: "https://github.com/"
        }, t.regexs = {
            atLink: /@(\w+)/g,
            email: /(\w+)@(\w+)\.(\w+)\.?(\w+)?/g,
            emailLink: /(mailto:)?([\w\.\_]+)@(\w+)\.(\w+)\.?(\w+)?/g,
            emoji: /:([\w\+-]+):/g,
            emojiDatetime: /(\d{2}:\d{2}:\d{2})/g,
            twemoji: /:(tw-([\w]+)-?(\w+)?):/g,
            fontAwesome: /:(fa-([\w]+)(-(\w+)){0,}):/g,
            editormdLogo: /:(editormd-logo-?(\w+)?):/g,
            pageBreak: /^\[[=]{8,}\]$/
        }, t.emoji = {
            path: "http://www.emoji-cheat-sheet.com/graphics/emojis/",
            ext: ".png"
        }, t.twemoji = {
            path: "http://twemoji.maxcdn.com/36x36/",
            ext: ".png"
        }, t.markedRenderer = function(i, o) {
            var n = {
                    toc: !0,
                    tocm: !1,
                    tocStartLevel: 1,
                    pageBreak: !0,
                    atLink: !0,
                    emailLink: !0,
                    taskList: !1,
                    emoji: !1,
                    tex: !1,
                    flowChart: !1,
                    sequenceDiagram: !1
                },
                a = e.extend(n, o || {}),
                s = t.$marked,
                l = new s.Renderer;
            i = i || [];
            var c = t.regexs,
                h = c.atLink,
                d = c.emoji,
                u = c.email,
                f = c.emailLink,
                g = c.twemoji,
                p = c.fontAwesome,
                m = c.editormdLogo,
                w = c.pageBreak;
            return l.emoji = function(e) {
                e = e.replace(t.regexs.emojiDatetime, function(e) {
                    return e.replace(/:/g, "&#58;")
                });
                var i = e.match(d);
                if (!i || !a.emoji) return e;
                for (var o = 0, r = i.length; r > o; o++) ":+1:" === i[o] && (i[o] = ":\\+1:"), e = e.replace(new RegExp(i[o]), function(e, i) {
                    var o = e.match(p),
                        r = e.replace(/:/g, "");
                    if (o)
                        for (var n = 0, a = o.length; a > n; n++) {
                            var s = o[n].replace(/:/g, "");
                            return '<i class="fa ' + s + ' fa-emoji" title="' + s.replace("fa-", "") + '"></i>'
                        } else {
                            var l = e.match(m),
                                c = e.match(g);
                            if (l)
                                for (var h = 0, d = l.length; d > h; h++) {
                                    var u = l[h].replace(/:/g, "");
                                    return '<i class="' + u + '" title="Editor.md logo (' + u + ')"></i>'
                                } else {
                                    if (!c) {
                                        var f = "+1" === r ? "plus1" : r;
                                        return f = "black_large_square" === f ? "black_square" : f, f = "moon" === f ? "waxing_gibbous_moon" : f, '<img src="' + t.emoji.path + f + t.emoji.ext + '" class="emoji" title="&#58;' + r + '&#58;" alt="&#58;' + r + '&#58;" />'
                                    }
                                    for (var w = 0, v = c.length; v > w; w++) {
                                        var k = c[w].replace(/:/g, "").replace("tw-", "");
                                        return '<img src="' + t.twemoji.path + k + t.twemoji.ext + '" title="twemoji-' + k + '" alt="twemoji-' + k + '" class="emoji twemoji" />'
                                    }
                                }
                        }
                });
                return e
            }, l.atLink = function(i) {
                return h.test(i) ? (a.atLink && (i = i.replace(u, function(e, t, i, o) {
                    return e.replace(/@/g, "_#_&#64;_#_")
                }), i = i.replace(h, function(e, i) {
                    return '<a href="' + t.urls.atLinkBase + i + '" title="&#64;' + i + '" class="at-link">' + e + "</a>"
                }).replace(/_#_&#64;_#_/g, "@")), a.emailLink && (i = i.replace(f, function(t, i, o, r, n) {
                    return !i && e.inArray(n, "jpg|jpeg|png|gif|webp|ico|icon|pdf".split("|")) < 0 ? '<a href="mailto:' + t + '">' + t + "</a>" : t
                })), i) : i
            }, l.link = function(e, t, i) {
                if (this.options.sanitize) {
                    try {
                        var o = decodeURIComponent(unescape(e)).replace(/[^\w:]/g, "").toLowerCase()
                    } catch (r) {
                        return ""
                    }
                    if (0 === o.indexOf("javascript:")) return ""
                }
                var n = '<a href="' + e + '"';
                return h.test(t) || h.test(i) ? (t && (n += ' title="' + t.replace(/@/g, "&#64;")), n + '">' + i.replace(/@/g, "&#64;") + "</a>") : (t && (n += ' title="' + t + '"'), n += ">" + i + "</a>")
            }, l.heading = function(e, t, o) {
                var n = e,
                    a = /\s*\<a\s*href\=\"(.*)\"\s*([^\>]*)\>(.*)\<\/a\>\s*/;
                if (a.test(e)) {
                    var s = [];
                    e = e.split(/\<a\s*([^\>]+)\>([^\>]*)\<\/a\>/);
                    for (var l = 0, c = e.length; c > l; l++) s.push(e[l].replace(/\s*href\=\"(.*)\"\s*/g, ""));
                    e = s.join(" ")
                }
                e = r(e);
                var h = e.toLowerCase().replace(/[^\w]+/g, "-"),
                    d = {
                        text: e,
                        level: t,
                        slug: h
                    },
                    u = /^[\u4e00-\u9fa5]+$/.test(e),
                    f = u ? escape(e).replace(/\%/g, "") : e.toLowerCase().replace(/[^\w]+/g, "-");
                i.push(d);
                var g = "<h" + t + ' id="h' + t + "-" + this.options.headerPrefix + f + '">';
                return g += '<a name="' + e + '" class="reference-link"></a>', g += '<span class="header-link octicon octicon-link"></span>', g += this.atLink(a ? this.emoji(n) : this.emoji(e)), g += "</h" + t + ">"
            }, l.pageBreak = function(e) {
                return w.test(e) && a.pageBreak && (e = '<hr style="page-break-after:always;" class="page-break editormd-page-break" />'), e
            }, l.paragraph = function(e) {
                var i = /\$\$(.*)\$\$/g.test(e),
                    o = /^\$\$(.*)\$\$$/.test(e),
                    r = o ? ' class="' + t.classNames.tex + '"' : "",
                    n = a.tocm ? /^(\[TOC\]|\[TOCM\])$/.test(e) : /^\[TOC\]$/.test(e),
                    s = /^\[TOCM\]$/.test(e);
                e = !o && i ? e.replace(/(\$\$([^\$]*)\$\$)+/g, function(e, i) {
                    return '<span class="' + t.classNames.tex + '">' + i.replace(/\$/g, "") + "</span>"
                }) : o ? e.replace(/\$/g, "") : e;
                var l = '<div class="markdown-toc editormd-markdown-toc">' + e + "</div>";
                return n ? s ? '<div class="editormd-toc-menu">' + l + "</div><br/>" : l : w.test(e) ? this.pageBreak(e) : "<p" + r + ">" + this.atLink(this.emoji(e)) + "</p>\n"
            }, l.code = function(e, i, o) {
                return "seq" === i || "sequence" === i ? '<div class="sequence-diagram">' + e + "</div>" : "flow" === i ? '<div class="flowchart">' + e + "</div>" : "math" === i || "latex" === i || "katex" === i ? '<p class="' + t.classNames.tex + '">' + e + "</p>" : s.Renderer.prototype.code.apply(this, arguments)
            }, l.tablecell = function(e, t) {
                var i = t.header ? "th" : "td",
                    o = t.align ? "<" + i + ' style="text-align:' + t.align + '">' : "<" + i + ">";
                return o + this.atLink(this.emoji(e)) + "</" + i + ">\n"
            }, l.listitem = function(e) {
                return a.taskList && /^\s*\[[x\s]\]\s*/.test(e) ? (e = e.replace(/^\s*\[\s\]\s*/, '<input type="checkbox" class="task-list-item-checkbox" /> ').replace(/^\s*\[x\]\s*/, '<input type="checkbox" class="task-list-item-checkbox" checked disabled /> '), '<li style="list-style: none;">' + this.atLink(this.emoji(e)) + "</li>") : "<li>" + this.atLink(this.emoji(e)) + "</li>"
            }, l
        }, t.markdownToCRenderer = function(e, t, i, o) {
            var r = "",
                n = 0,
                a = this.classPrefix;
            o = o || 1;
            for (var s = 0, l = e.length; l > s; s++) {
                var c = e[s].text,
                    h = e[s].level;
                o > h || (r += h > n ? "" : n > h ? new Array(n - h + 2).join("</ul></li>") : "</ul></li>", r += '<li><a class="toc-level-' + h + '" href="#' + c + '" level="' + h + '">' + c + "</a><ul>", n = h)
            }
            var d = t.find(".markdown-toc");
            if (d.length < 1 && "false" === t.attr("previewContainer")) {
                var u = '<div class="markdown-toc ' + a + 'markdown-toc"></div>';
                u = i ? '<div class="' + a + 'toc-menu">' + u + "</div>" : u, t.html(u), d = t.find(".markdown-toc")
            }
            return i && d.wrap('<div class="' + a + 'toc-menu"></div><br/>'), d.html('<ul class="markdown-toc-list"></ul>').children(".markdown-toc-list").html(r.replace(/\r?\n?\<ul\>\<\/ul\>/g, "")), d
        }, t.tocDropdownMenu = function(t, i) {
            i = i || "Table of Contents";
            var o = 400,
                r = t.find("." + this.classPrefix + "toc-menu");
            return r.each(function() {
                var t = e(this),
                    r = t.children(".markdown-toc"),
                    n = '<i class="fa fa-angle-down"></i>',
                    a = '<a href="javascript:;" class="toc-menu-btn">' + n + i + "</a>",
                    s = r.children("ul"),
                    l = s.find("li");
                r.append(a), l.first().before("<li><h1>" + i + " " + n + "</h1></li>"), t.mouseover(function() {
                    s.show(), l.each(function() {
                        var t = e(this),
                            i = t.children("ul");
                        if ("" === i.html() && i.remove(), i.length > 0 && "" !== i.html()) {
                            var r = t.children("a").first();
                            r.children(".fa").length < 1 && r.append(e(n).css({
                                "float": "right",
                                paddingTop: "4px"
                            }))
                        }
                        t.mouseover(function() {
                            i.css("z-index", o).show(), o += 1
                        }).mouseleave(function() {
                            i.hide()
                        })
                    })
                }).mouseleave(function() {
                    s.hide()
                })
            }), r
        }, t.filterHTMLTags = function(t, i) {
            if ("string" != typeof t && (t = new String(t)), "string" != typeof i) return t;
            for (var o = i.split("|"), r = o[0].split(","), n = o[1], a = 0, s = r.length; s > a; a++) {
                var l = r[a];
                t = t.replace(new RegExp("<s*" + l + "s*([^>]*)>([^>]*)<s*/" + l + "s*>", "igm"), "")
            }
            if ("undefined" != typeof n) {
                var c = /\<(\w+)\s*([^\>]*)\>([^\>]*)\<\/(\w+)\>/gi;
                t = "*" === n ? t.replace(c, function(e, t, i, o, r) {
                    return "<" + t + ">" + o + "</" + r + ">"
                }) : "on*" === n ? t.replace(c, function(t, i, o, r, n) {
                    var a = e("<" + i + ">" + r + "</" + n + ">"),
                        s = e(t)[0].attributes,
                        l = {};
                    e.each(s, function(e, t) {
                        '"' !== t.nodeName && (l[t.nodeName] = t.nodeValue)
                    }), e.each(l, function(e) {
                        0 === e.indexOf("on") && delete l[e]
                    }), a.attr(l);
                    var c = "undefined" != typeof a[1] ? e(a[1]).text() : "";
                    return a[0].outerHTML + c
                }) : t.replace(c, function(t, i, o, r) {
                    var a = n.split(","),
                        s = e(t);
                    return s.html(r), e.each(a, function(e) {
                        s.attr(a[e], null)
                    }), s[0].outerHTML
                })
            }
            return t
        }, t.markdownToHTML = function(i, o) {
            var r = {
                gfm: !0,
                toc: !0,
                tocm: !1,
                tocStartLevel: 1,
                tocTitle: "目录",
                tocDropdown: !1,
                tocContainer: "",
                markdown: "",
                markdownSourceCode: !1,
                htmlDecode: !1,
                autoLoadKaTeX: !0,
                pageBreak: !0,
                atLink: !0,
                emailLink: !0,
                tex: !1,
                taskList: !1,
                emoji: !1,
                flowChart: !1,
                sequenceDiagram: !1,
                previewCodeHighlight: !0
            };
            t.$marked = marked;
            var n = e("#" + i),
                a = n.settings = e.extend(!0, r, o || {}),
                s = n.find("textarea");
            s.length < 1 && (n.append("<textarea></textarea>"), s = n.find("textarea"));
            var l = "" === a.markdown ? s.val() : a.markdown,
                c = [],
                h = {
                    toc: a.toc,
                    tocm: a.tocm,
                    tocStartLevel: a.tocStartLevel,
                    taskList: a.taskList,
                    emoji: a.emoji,
                    tex: a.tex,
                    pageBreak: a.pageBreak,
                    atLink: a.atLink,
                    emailLink: a.emailLink,
                    flowChart: a.flowChart,
                    sequenceDiagram: a.sequenceDiagram,
                    previewCodeHighlight: a.previewCodeHighlight
                },
                d = {
                    renderer: t.markedRenderer(c, h),
                    gfm: a.gfm,
                    tables: !0,
                    breaks: !0,
                    pedantic: !1,
                    sanitize: a.htmlDecode ? !1 : !0,
                    smartLists: !0,
                    smartypants: !0
                };
            l = new String(l);
            var u = marked(l, d);
            u = t.filterHTMLTags(u, a.htmlDecode), a.markdownSourceCode ? s.text(l) : s.remove(), n.addClass("markdown-body " + this.classPrefix + "html-preview").append(u);
            var f = "" !== a.tocContainer ? e(a.tocContainer) : n;
            if ("" !== a.tocContainer && f.attr("previewContainer", !1), a.toc && (n.tocContainer = this.markdownToCRenderer(c, f, a.tocDropdown, a.tocStartLevel), (a.tocDropdown || n.find("." + this.classPrefix + "toc-menu").length > 0) && this.tocDropdownMenu(n, a.tocTitle), "" !== a.tocContainer && n.find(".editormd-toc-menu, .editormd-markdown-toc").remove()), a.previewCodeHighlight && (n.find("pre").addClass("prettyprint linenums"), prettyPrint()), t.isIE8 || (a.flowChart && n.find(".flowchart").flowChart(), a.sequenceDiagram && n.find(".sequence-diagram").sequenceDiagram({
                theme: "simple"
            })), a.tex) {
                var g = function() {
                    n.find("." + t.classNames.tex).each(function() {
                        var t = e(this);
                        katex.render(t.html().replace(/&lt;/g, "<").replace(/&gt;/g, ">"), t[0]), t.find(".katex").css("font-size", "1.6em")
                    })
                };
                !a.autoLoadKaTeX || t.$katex || t.kaTeXLoaded ? g() : this.loadKaTeX(function() {
                    t.$katex = katex, t.kaTeXLoaded = !0, g()
                })
            }
            return n.getMarkdown = function() {
                return s.val()
            }, n
        }, t.themes = ["default", "dark"], t.previewThemes = ["default", "dark"], t.editorThemes = ["default", "3024-day", "3024-night", "ambiance", "ambiance-mobile", "base16-dark", "base16-light", "blackboard", "cobalt", "eclipse", "elegant", "erlang-dark", "lesser-dark", "mbo", "mdn-like", "midnight", "monokai", "neat", "neo", "night", "paraiso-dark", "paraiso-light", "pastel-on-dark", "rubyblue", "solarized", "the-matrix", "tomorrow-night-eighties", "twilight", "vibrant-ink", "xq-dark", "xq-light"], t.loadPlugins = {}, t.loadFiles = {
            js: [],
            css: [],
            plugin: []
        }, t.loadPlugin = function(e, i, o) {
            i = i || function() {}, this.loadScript(e, function() {
                t.loadFiles.plugin.push(e), i()
            }, o)
        }, t.loadCSS = function(e, i, o) {
            o = o || "head", i = i || function() {};
            var r = document.createElement("link");
            r.type = "text/css", r.rel = "stylesheet", r.onload = r.onreadystatechange = function() {
                t.loadFiles.css.push(e), i()
            }, r.href = e + ".css", "head" === o ? document.getElementsByTagName("head")[0].appendChild(r) : document.body.appendChild(r)
        }, t.isIE = "Microsoft Internet Explorer" == navigator.appName, t.isIE8 = t.isIE && "8." == navigator.appVersion.match(/8./i), t.loadScript = function(e, i, o) {
            o = o || "head", i = i || function() {};
            var r = null;
            r = document.createElement("script"), r.id = e.replace(/[\./]+/g, "-"), r.type = "text/javascript", r.src = e + ".js", t.isIE8 ? r.onreadystatechange = function() {
                r.readyState && ("loaded" === r.readyState || "complete" === r.readyState) && (r.onreadystatechange = null, t.loadFiles.js.push(e), i())
            } : r.onload = function() {
                t.loadFiles.js.push(e), i()
            }, "head" === o ? document.getElementsByTagName("head")[0].appendChild(r) : document.body.appendChild(r)
        }, t.katexURL = {
            css: "md-editor/js/lib/KaTeX0.4.3/katex.min",
            js:  "md-editor/js/lib/KaTeX0.4.3/katex.min"
        }, t.kaTeXLoaded = !1, t.loadKaTeX = function(e) {
            t.loadCSS(t.katexURL.css, function() {
                t.loadScript(t.katexURL.js, e || function() {})
            })
        }, t.lockScreen = function(t) {
            e("html,body").css("overflow", t ? "hidden" : "")
        }, t.createDialog = function(i) {
            var o = {
                name: "",
                width: 420,
                height: 240,
                title: "",
                drag: !0,
                closed: !0,
                content: "",
                mask: !0,
                maskStyle: {
                    backgroundColor: "#fff",
                    opacity: .1
                },
                lockScreen: !0,
                footer: !0,
                buttons: !1
            };
            i = e.extend(!0, o, i);
            var r = this,
                n = this.editor,
                a = t.classPrefix,
                s = (new Date).getTime(),
                l = "" === i.name ? a + "dialog-" + s : i.name,
                c = t.mouseOrTouch,
                h = '<div class="' + a + "dialog " + l + '">';
            "" !== i.title && (h += '<div class="' + a + 'dialog-header"' + (i.drag ? ' style="cursor: move;"' : "") + ">", h += '<strong class="' + a + 'dialog-title">' + i.title + "</strong>", h += "</div>"), i.closed && (h += '<a href="javascript:;" class="fa fa-close ' + a + 'dialog-close"></a>'), h += '<div class="' + a + 'dialog-container">' + i.content, (i.footer || "string" == typeof i.footer) && (h += '<div class="' + a + 'dialog-footer">' + ("boolean" == typeof i.footer ? "" : i.footer) + "</div>"), h += "</div>", h += '<div class="' + a + "dialog-mask " + a + 'dialog-mask-bg"></div>', h += '<div class="' + a + "dialog-mask " + a + 'dialog-mask-con"></div>', h += "</div>", n.append(h);
            var d = n.find("." + l);
            d.lockScreen = function(t) {
                return i.lockScreen && (e("html,body").css("overflow", t ? "hidden" : ""), r.resize()), d
            }, d.showMask = function() {
                return i.mask && n.find("." + a + "mask").css(i.maskStyle).css("z-index", t.dialogZindex - 1).show(), d
            }, d.hideMask = function() {
                return i.mask && n.find("." + a + "mask").hide(), d
            }, d.loading = function(e) {
                var t = d.find("." + a + "dialog-mask");
                return t[e ? "show" : "hide"](), d
            }, d.lockScreen(!0).showMask(), d.show().css({
                zIndex: t.dialogZindex,
                border: t.isIE8 ? "1px solid #ddd" : "",
                width: "number" == typeof i.width ? i.width + "px" : i.width,
                height: "number" == typeof i.height ? i.height + "px" : i.height
            });
            var u = function() {
                d.css({
                    top: (e(window).height() - d.height()) / 2 + "px",
                    left: (e(window).width() - d.width()) / 2 + "px"
                })
            };
            if (u(), e(window).resize(u), d.children("." + a + "dialog-close").bind(c("click", "touchend"), function() {
                d.hide().lockScreen(!1).hideMask()
            }), "object" == typeof i.buttons) {
                var f = d.footer = d.find("." + a + "dialog-footer");
                for (var g in i.buttons) {
                    var p = i.buttons[g],
                        m = a + g + "-btn";
                    f.append('<button class="' + a + "btn " + m + '">' + p[0] + "</button>"), p[1] = e.proxy(p[1], d), f.children("." + m).bind(c("click", "touchend"), p[1])
                }
            }
            if ("" !== i.title && i.drag) {
                var w, v, k = d.children("." + a + "dialog-header");
                i.mask || k.bind(c("click", "touchend"), function() {
                    t.dialogZindex += 2, d.css("z-index", t.dialogZindex)
                }), k.mousedown(function(e) {
                    e = e || window.event, w = e.clientX - parseInt(d[0].style.left), v = e.clientY - parseInt(d[0].style.top), document.onmousemove = y
                });
                var b = function(e) {
                        e.removeClass(a + "user-unselect").off("selectstart")
                    },
                    x = function(e) {
                        e.addClass(a + "user-unselect").on("selectstart", function(e) {
                            return !1
                        })
                    },
                    y = function(t) {
                        t = t || window.event;
                        var i, o, r = parseInt(d[0].style.left),
                            n = parseInt(d[0].style.top);
                        r >= 0 ? r + d.width() <= e(window).width() ? i = t.clientX - w : (i = e(window).width() - d.width(), document.onmousemove = null) : (i = 0, document.onmousemove = null), n >= 0 ? o = t.clientY - v : (o = 0, document.onmousemove = null), document.onselectstart = function() {
                            return !1
                        }, x(e("body")), x(d), d[0].style.left = i + "px", d[0].style.top = o + "px"
                    };
                document.onmouseup = function() {
                    b(e("body")), b(d), document.onselectstart = null, document.onmousemove = null
                }, k.touchDraggable = function() {
                    var t = null,
                        i = function(i) {
                            var o = i.originalEvent,
                                r = e(this).parent().position();
                            t = {
                                x: o.changedTouches[0].pageX - r.left,
                                y: o.changedTouches[0].pageY - r.top
                            }
                        },
                        o = function(i) {
                            i.preventDefault();
                            var o = i.originalEvent;
                            e(this).parent().css({
                                top: o.changedTouches[0].pageY - t.y,
                                left: o.changedTouches[0].pageX - t.x
                            })
                        };
                    this.bind("touchstart", i).bind("touchmove", o)
                }, k.touchDraggable()
            }
            return t.dialogZindex += 2, d
        }, t.mouseOrTouch = function(e, t) {
            e = e || "click", t = t || "touchend";
            var i = e;
            try {
                document.createEvent("TouchEvent"), i = t
            } catch (o) {}
            return i
        }, t.dateFormat = function(e) {
            e = e || "";
            var t = function(e) {
                    return 10 > e ? "0" + e : e
                },
                i = new Date,
                o = i.getFullYear(),
                r = o.toString().slice(2, 4),
                n = t(i.getMonth() + 1),
                a = t(i.getDate()),
                s = i.getDay(),
                l = t(i.getHours()),
                c = t(i.getMinutes()),
                h = t(i.getSeconds()),
                d = t(i.getMilliseconds()),
                u = "",
                f = r + "-" + n + "-" + a,
                g = o + "-" + n + "-" + a,
                p = l + ":" + c + ":" + h;
            switch (e) {
                case "UNIX Time":
                    u = i.getTime();
                    break;
                case "UTC":
                    u = i.toUTCString();
                    break;
                case "yy":
                    u = r;
                    break;
                case "year":
                case "yyyy":
                    u = o;
                    break;
                case "month":
                case "mm":
                    u = n;
                    break;
                case "cn-week-day":
                case "cn-wd":
                    var m = ["日", "一", "二", "三", "四", "五", "六"];
                    u = "星期" + m[s];
                    break;
                case "week-day":
                case "wd":
                    var w = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
                    u = w[s];
                    break;
                case "day":
                case "dd":
                    u = a;
                    break;
                case "hour":
                case "hh":
                    u = l;
                    break;
                case "min":
                case "ii":
                    u = c;
                    break;
                case "second":
                case "ss":
                    u = h;
                    break;
                case "ms":
                    u = d;
                    break;
                case "yy-mm-dd":
                    u = f;
                    break;
                case "yyyy-mm-dd":
                    u = g;
                    break;
                case "yyyy-mm-dd h:i:s ms":
                case "full + ms":
                    u = g + " " + p + " " + d;
                    break;
                case "full":
                case "yyyy-mm-dd h:i:s":
                default:
                    u = g + " " + p
            }
            return u
        }, t
    }
});